#include "test06_Oop.h"
#include "test06_2_Oop.h"
//#include <iostream>
//#include <string>


// 面向对象

void test06_Oop::classMain()
{
	std::cout << "test06_Oop\n";

	// 类的定义和实现在同一个文件中
	StructClass* ss = new StructClass(); // 手动分配内存，需要手动释放
	StructClass sa; // 自动分配内存
	sa.getStructureOfClass();
	sa.jiaoHuan();


	// 继承
	//PerA pa1; // 实例化一个子类对象，也是一个内部类
	//pa1.saidWord(); // PerA 继承了父类的 saidWord 方法
	//pa1.saidSelfName(); // PerA 自己的方法


	// 虚函数 = 重写
	Personal p; // 含有纯虚函数时，变为抽象类，无法实例化
	PerA pa;
	p.saidWord();
	pa.saidSelfName();
	p.show();
	pa.show();

	// override重写父类方法
	p.myOverride();
	pa.myOverride();
	
	// 内联函数
	p.l1();
	//p.l2();
	
	// 抽象类 = 在c++中含有纯虚函数的类是抽象类，纯虚函数是在函数的原型后添加=0
	//  含有纯虚函数时，变为抽象类，无法实例化
	StructClass::clzzA scca;
	scca.doSomething();

	//StructClass::stu scstu;
	//StructClass::stu scstu2(1,5);
	//scstu.tA();
}




// C++中类和结构体比较相似
// 类中可以定义属性和方法，结构体中声明变量，是一组变量组成的数据结构，操作是
// 一个空类也含有四种函数，构造函数，析构函数，赋值函数，拷贝函数

//   默认访问权限：类的成员默认是私有（private）的，而结构体的成员默认是公有（public）的。这意味着在类中，成员变量和成员函数默认情况下只能在类内部访问，而在结构体中，默认可以在外部访问。
//   继承方式：当使用类作为基类进行继承时，默认继承方式是私有继承（private inheritance），而当使用结构体作为基类进行继承时，默认继承方式是公有继承（public inheritance）。
//   内存布局：在C++中，类和结构体的内存布局是相同的，它们都可以包含成员变量和成员函数。唯一的区别是，默认情况下，类的成员是私有的，而结构体的成员是公有的。
//   类型别名：在C++11及以后的标准中，类和结构体都可以使用using关键字定义类型别名。
//   使用习惯：根据语义的不同，通常将结构体用于表示一组相关的数据，而将类用于表示一组相关的数据和操作。
//   需要注意的是，除了上述区别之外，类和结构体在语法上几乎是相同的，可以具有成员变量、成员函数、构造函数、析构函数等，并且都可以使用访问修饰符（如public、private、protected）来控制成员的访问权限


// 内联函数
//   可以使用inline关键字来定义内联函数。内联函数通常适用于函数体简单、调用频繁的情况，
//   编译器会将内联函数的代码直接嵌入到调用该函数的地方，避免了函数调用的开销





////////////// 有参构造

void StructClass::stu::tA()
{
	std::cout << "===StructClass::stu::tA===";
	std::cout << StructClass::stu::a << "\n";
	std::cout << StructClass::stu::b << "\n";
}


